package com.hmall.item.web;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmall.common.dto.PageDTO;
import com.hmall.item.pojo.Item;
import com.hmall.item.service.IItemService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/item")
@Slf4j
public class ItemController {

    @Autowired
    private IItemService itemService;

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @PutMapping("/stock/{itemId}/{num}")
    /**
     * 扣减商品库存
     */
    public void updateStock(@PathVariable("itemId") Long itemId,@PathVariable("num") Integer num){
        Item item = itemService.getById(itemId);
        //库存扣减
        Integer status = item.getStock();
        item.setStock(status-num);
//        int i = 12/0;
        //入库
        itemService.updateById(item);
    }

    @GetMapping("/lists")
    /**
     * 查询所有
     */
    public List<Item> selectList(){
        //1 创建IPage分页对象,设置分页参数
        List<Item> list = this.itemService.list();
        //2 返回实体
        return list;
    }

    @GetMapping("/list")
    /**
     * 分页查询
     */
    public PageDTO<Item> getItemList(Integer page,Integer size){
        //1 创建IPage分页对象,设置分页参数
        IPage<Item> ipage = new Page<>(page,size);
        IPage<Item> ip = itemService.page(ipage);
        //2 返回实体
        return new PageDTO<>(ip.getTotal(),ip.getRecords());
    }

    @GetMapping("/{id}")
    /**
     * 根据id查询商品
     */
    public Item getbyId(@PathVariable Long id){
        //1、查询条件id
        Item item = this.itemService.getById(id);
        return item;
    }

    @PostMapping
    /**
     * 新增商品
     */
    public String save(@RequestBody Item item){
        //1、数据校验
        //2、调用新增方法
        boolean save = this.itemService.save(item);
        //3、 交换机名称
        String exchangeName = "itcast.cxk";
        // 消息
        String message = JSON.toJSONString(item);
        //4、 发送消息
        rabbitTemplate.convertAndSend(exchangeName, "save", message);
        if (save){
            return "新增成功";
        }else {
            return "新增失败";
        }
    }
    @PutMapping("/status/{id}/{status}")
    /**
     * 上下架
     */
    public void status(@PathVariable("id") Long id ,@PathVariable("status") Integer status){
        //1、生成实体
        Item item = Item.builder().id(id).status(status).build();
        log.info("商品id：{}，操作类型：{}",id,status == 1 ? "上架":"下架");
        //2、调用修改方法
        this.itemService.updateById(item);
    }

    @PutMapping
    /**
     * 修改商品
     */
    public void updateInfo(@RequestBody Item item){
        Long id = item.getId();
        //1、数据校验
        log.info("操作类型：新增，商品id：{}，操作数据：{}",id,item);
        if(ObjectUtils.isEmpty(item.getId())){
            throw new RuntimeException("id不能为空！");
        }
        Integer status = this.itemService.getById(id).getStatus();

        if(status == 1){
            throw new RuntimeException("商品正在售卖，请先下架后在修改！！");
        }

        //2、调用修改方法
        this.itemService.updateById(item);

        //3、 交换机名称
        String exchangeName = "itcast.cxk";
        // 消息
        String message = JSON.toJSONString(item);
        //4、 发送消息
        rabbitTemplate.convertAndSend(exchangeName, "save", message);
    }

    @DeleteMapping("/{id}")
    /**
     * 根据id删除商品
     */
    public void deleteById(@PathVariable("id") Long id ){
        //1、数据校验
        //1.1、判断商品是否上架
        Item item = this.itemService.getById(id);

        if(ObjectUtils.isEmpty(item)){
            throw new RuntimeException("商品不存在！");
        }

        log.info("操作类型：删除，商品id：{}，操作数据：{}",id,item);

        if(item.getStatus() == 1){
            throw new RuntimeException("商品正在售卖，请先下架后在删除！");
        }
        //2、调用修改方法
        this.itemService.removeById(id);

        //3、 交换机名称
        String exchangeName = "itcast.cxk";
        // 消息
        String message = id.toString();
        //4、 发送消息
        rabbitTemplate.convertAndSend(exchangeName, "delete", message);
    }
}
